FAQ

1. Wat is de licentie van FPDF? Zijn er restricties voor het gebruik?
2. Wanneer ik een PDF probeer aan te maken, krijg ik veel rare tekens op mijn beeldscherm. Waarom?
3. Ik probeer een PDF te genereren en IE geeft een lege pagina. Wat gebeurt er?
4. Ik stuur parameters en ik gebruik de POST methode, maar de waardes verschijnen niet in het PDF document.
5. Wanneer ik een PHP sessie gebruik, geeft IE mijn PDF document niet meer weer maar vraagt mij het te downloaden.
6. Als ik op SSL ben, kan IE het PDF document niet openen.
7. Als ik een script uitvoer krijg ik de melding: "FPDF error: Don't alter the locale before including class file".
8. Ik probeer een PNG afbeelding in te voegen en Acrobat zegt: "There was an error processing a page. A drawing error occurred".
9. Ik kom de volgende fout tegen wanneer ik probeer een PDF document te genereren: "Warning: Cannot add header information - headers already sent by (output started at script.php:X)"
10. Ik probeer een variabele in de Header() methode weer te geven maar er verschijnt niets.
11. Ik heb de Header() en Footer() methodes in mijn PDF class maar er verschijnt niets.
12. Het lukt niet om line breaks te laten werken. Ik heb \n in de string ingevoegd en geprint met Multicell() maar het werkt niet.
13. Ik probeer het euro symbool in te voegen maar dit werkt niet.
14. Ik teken een frame met zeer precieze afmetingen, maar wanneer ik het afgedrukt heb zie ik enkele afwijkingen.
15. Ik wil de hele oppervlakte van het papier gebruiken, maar als ik print heb ik altijd een kleine marge. Hoe kan ik hier van af komen?
16. Wat is de limiet van de bestanden die ik kan genereren met FPDF?
17. Kan ik een PDF document wijzigen met FPDF?
18. Ik wil een zoekmachine maken in PHP en PDF bestanden indexeren. Kan ik dit doen met FPDF?
19. Kan ik een HTMl pagina naar PDF converteren met FPDF?
20. Kan ik PDF bestanden aaneenschakelen met FPDF?


1. Wat is de licentie van FPDF? Zijn er restricties voor het gebruik?

FPDF is Freeware (dit is in het begin van het bronbestand vermeld). Er is geen restrictie voor het gebruik. U mag het gratis in Uw toepassing invoegen (commercieel of niet), met of zonder aanpassingen.

2. Wanneer ik een PDF probeer aan te maken, krijg ik veel rare tekens op mijn beeldscherm. Waarom?

Deze 'rare' tekens zijn in feite de actuele inhoud van het PDF document. Dit gedrag is een fout van IE. Wanneer het eerst een HTML pagina ontvangt en daarna een PDF van hetzelde adres, toont het deze direct zonder eerst Acrobat op te starten. Dit gebeurt vaker als U een document aan het ontwekpen bent: Bij het kleinste fout in het script wordt een HTML pagina verzonden, en na wijziging komt de PDF aan.
Om dit probleem op te lossen, sluit u simpelweg IE af en start het opnieuw op. U kunt ook naar een andere URL gaan en terugkomen.
Om dit soort fouten te voorkomen tijdens het ontwerpen, kunt U de PDF direct naar een bestand genereren en het openen via de browser.

3. Ik probeer een PDF te genereren en IE geeft een lege pagina. Wat gebeurt er?

Ten eerste, kijk of U niets meer naar de browser stuurt na de PDF (niet eens een spatie of een enter). Je kan een exit statement ( ?> ) na de aanroep naar de Output() methode om zeker te zijn.
Als het nog steeds niet werkt, betekent het dat U het slachtoffer bent van het "lege pagina syndroom". IE gebruikt in combinatie met de Acrobat plugin heeft nog diverse fouten, in alle versies. U zou Uw script met zo veel mogelijk versies van IE als mogelijk moeten proberen (ten minste als U verbonden bent met internet). Het probleem komt vaak voor met de POST methode en het wordt aangeraden deze te ontwijken (ook omdat het nog meer problemen veroorzaakt, zie de volgende vraag). GET werkt beter maar kan falen wanneer de URL te lang wordt: Gebruik geen oproep met meer dan 45 tekens. Toch bestaat er een truc om deze limiet te omzeilen: Beëindig de URL met .pdf . Als U een formulier gebruikt, kunt U een verborgen veld op de laatste positie toevoegen:

<INPUT TYPE="HIDDEN" NAME="ext" VALUE=".pdf">

Het gebruik van PHP sessies veroorzaakt ook vaak problemen (vermijdt het gebruik van HTTP headers om caching te voorkomen). Zie vraag 5.

Om al deze problemen in een redelijk eenvoudige manier te ontwijken, bestaan er 2 technieken:

- Schakel de plug-in uit en gebruik Acrobat als programma. Start Acrobat, in het menu Bestand, Voorkeuren, Algemeen, zet de optie "Web browser intergratie" uit (voor acrobat 5: Wijzigen, voorkeuren, opties, "Geef PDF weer in browser"). De volgende keer dat U een PDF in IE opent, komt het dialoog scherm "Openen"of "Opslaan" naar voren. Zet de optie "Altijd vragen voor het openen van dit type document" en kies openen. Vanaf nu, zullen PDF bestanden automatisch in een extern Acrobat scherm geopend worden.
De keerzijde van deze methode is dat je de instellingen van de client moet wijzigen, wat je kan doen op een intranet maar niet op het Internet.

- Gebruik een redirect techniek. Dit bestaat uit het genereren van een PDF document in een tijdelijk bestand op de server en redirect de client naar het (door Javascript te gebruiken, niet de Locatie HTTP Header omdat deze ook problemen veroorzaakt). Bijvoorbeeld, aan het eind van het script, kunt U het volgende plaatsen:

//Bepaal de naam van het tijdelijke bestand in de huidige directory
$file=basename(tempnam(getcwd(),'tmp'));
//Sla het PDF document op in een bestand
$pdf->Output($file);
//JavaScript redirect
echo "<HTML><SCRIPT>document.location='getpdf.php?f=$file';</SCRIPT></HTML>";

Maak dan het getpdf.php bestand aan met het volgende:

<?php
$f=$HTTP_GET_VARS['f'];
//Kijk het bestand na (niet overslaan!)
if(substr($f,0,3)!='tmp' or strpos($f,'/') or strpos($f,'\\'))
    die('Bestandsnaam niet correct');
if(!file_exists($f))
    die('Bestand bestaat niet');
//Behandel speciale IE aanvragen wanneer nodig
if($HTTP_SERVER_VARS['HTTP_USER_AGENT']=='contype')
{
    Header('Content-Type: application/pdf');
    exit;
}
//Output PDF
Header('Content-Type: application/pdf');
Header('Content-Length: '.filesize($f));
readfile($f);
//Verwijder bestand
unlink($f);
exit;
?>

Deze methode werkt in de meeste gevallen maar IE6 kan nog enkele problemen ondervinden. Een manier die altijd werkt bestaat uit het direct redirecten naar het tijdelijke bestand. De bestandsnaam moet daarvoor eindigen op .pdf:

//Bepaal de naam van het tijdelijke bestand in de huidige directory
$file=basename(tempnam(getcwd(),'tmp'));
rename($file,$file.'.pdf');
$file.='.pdf';
//Sla het PDF document op in een bestand
$pdf->Output($file);
//JavaScript redirect
echo "<HTML><SCRIPT>document.location='$file';</SCRIPT></HTML>";

Deze methode keert het dynamische PDF document in een statische en vermijdt alle problemen. Maar U moet wel wat schoonmaken om de tijdelijke bestanden te verwijderen. Bijvoorbeeld:

function CleanFiles($dir)
{
    //Verwijder tijdelijk bestanden
    $t=time();
    $h=opendir($dir);
    while($file=readdir($h))
    {
        if(substr($file,0,3)=='tmp' and substr($file,-4)=='.pdf')
        {
            $path=$dir.'/'.$file;
            if($t-filemtime($path)>3600)
                @unlink($path);
        }
    }
    closedir($h);
}

Deze functie verwijdert alle bestanden in de vorm tmp*.pdf ouder dan een uur in de opgegeven directory. U kunt het aanroepen wanneer U wilt, bijvoorbeeld in het script wat de PDF genereert.

Opmerking: Het is nodig om het PDF bestand in een nieuw scherm te openen, omdat U niet terug kan vanwege de redirect.

4. Ik stuur parameters en ik gebruik de POST methode, maar de waardes verschijnen niet in het PDF document.

Het probleem komt voor in enkele versies van IE (vooral de eerste 5.5). Zie de vorige vraag voor een manier om het probleem te verhelpen.

5. Wanneer ik een PHP sessie gebruik, geeft IE mijn PDF document niet meer weer maar vraagt mij het te downloaden.

Het is een probleem wat in sommige versies van IE voor komt. Om het te verhelpen, voegt U de volgende regel toe voor session_start():

session_cache_limiter('private');

Of voer een redirect uit zoals uitgelegd in vraag 3.

6. Als ik op SSL ben, kan IE het PDF document niet openen.

Het probleem kan worden opgelost door de volgende regel toe te voegen:

Header('Pragma: public');

7. Als ik een script uitvoer krijg ik de melding: "FPDF error: Don't alter the locale before including class file".

Wanneer de decimalen scheider is ingesteld als een komma voor het invoegen van een bestand, is er een Fout in PHP en decimale nummers worden afgekapt. Hierom wordt het afgeraden om setlocale() in te stellen voor het invoegen van de class. Op Unix wordt het afgeraden de LC_ALL omgeving variabele in te stellen, omdat het gelijkwaardig is aan de setlocale() aanroep.

8. Ik probeer een PNG afbeelding in te voegen en Acrobat zegt: "There was an error processing a page. A drawing error occurred".

Acrobat 5 heeft een fout en kan geen transparante zwartwit afbeeldingen weergeven (bijvoorbeeld met 1 bit per pixel). Verwijder de transparantheid en sla uw afbeelding op in 16 kleuren (4 bits per pixel) of meer.

9. Ik kom de volgende fout tegen wanneer ik probeer een PDF document te genereren: "Warning: Cannot add header information - headers already sent by (output started at script.php:X)"

U moet niets naar de browser sturen behalve de PDF zelf: geen HTML, geen spaties, geen enters, niet ervoor noch erachter. Het script stuurt iets naar de browser op regel X.

10. Ik probeer een variabele in de Header() methode weer te geven maar er verschijnt niets.

U moet het global keyword gebruiken, bijvoorbeeld:

function Header()
{
    global $title;

    $this->SetFont('Arial','B',15);
    $this->Cell(0,10,$title,1,1,'C');
}

11. Ik heb de Header() en Footer() methodes in mijn PDF class maar er verschijnt niets.

U moet een object aanmaken vanaf de PDF class, niet FPDF:

$pdf=new PDF();

12. Het lukt niet om line breaks te laten werken. Ik heb \n in de string ingevoegd en geprint met Multicell() maar het werkt niet.

U moet Uw string omvatten met dubbele aanhalingstekens, niet met enkele.

13. Ik probeer het euro symbool in te voegen maar dit werkt niet.

De standaard lettertypes hebben het euro teken op positie 128. U kunt een constante definiëren zoals dit voor het gemak:

define('EURO',chr(128));

14. Ik teken een frame met zeer precieze afmetingen, maar wanneer ik het afgedrukt heb zie ik enkele afwijkingen.

Om afmetingen aan te houden, kunt U de optie "Aanpassen aan pagina" uitschakelen in het printer dialoog scherm.

15. Ik wil de hele oppervlakte van het papier gebruiken, maar als ik print heb ik altijd een kleine marge. Hoe kan ik hier van af komen?

Alle printers hebben physieke marges (afhankelijk van het model), het is daarom onmogelijk om deze te verwijderen en het gehele papier te beprinten.

16. Wat is de limiet van de bestanden die ik kan genereren met FPDF?

Er is geen bepaalde limiet. Er zijn echter enkele beperkingen:

- Het maximale gehoudgen toegedeeld aan PHP scripts staat standaard op 8MB. Voor zeer grote documenten, speciaal met afbeeldingen, zal deze limiet snel bereikt worden (het bestand wordt in het geheugen opgebouwd). De parameter is ingesteld in het php.ini bestand.

- De maximale uitvoer tijd toegedeeld is standaard op 30 seconden ingesteld. Deze limiet kan natuurlijk eenvoudig bereikt worden. Het is ingesteld in php.ini en kan dynamisch worden gewijizigd met set_time_limit().

- Browsers hebben algemeen een 5 minuten time-out. Als U het PDF document direct naar de browser stuurt en de limiet bereikt, zal het verloren zijn. Het is daarom aangeraden om zeer grote documenten in een bestand te genereren en data van tijd tot tijd naar de browser te seturen (bijvoorbeeld pagina1, pagina2... met flush() om de output te forceren). Wanneer het document is voltooid, kunt U een redirect sturen met javascript of een link aanmaken.
Opmerking: Zelfs als de browser een time-out genereert, kan het script blijven draaien op de server.

17. Kan ik een PDF document wijzigen met FPDF?

Nee.

18. Ik wil een zoekmachine maken in PHP en PDF bestanden indexeren. Kan ik dit doen met FPDF?

Nee. Maar een GPL C programma bestaat, pdftotext, wat de tekstuele inhoud uit het document kan filteren. Het wordt geleverd met het Xpdf pakket:

http://www.foolabs.com/xpdf/

19. Kan ik een HTMl pagina naar PDF converteren met FPDF?

Nee. Maar een GPL C programma bestaat, htmldoc, wat deze taak uitvoert en goede resultaten geeft:

http://www.htmldoc.org

20. Kan ik PDF bestanden aaneenschakelen met FPDF?

Nee. Maar een gratis C programma bestaat voor deze taak:

http://thierry.schmit.free.fr/dev/mbtPdfAsm/enMbtPdfAsm2.html